home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-10-28 | 75.0 KB | 2,113 lines |
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- NNNNAAAAMMMMEEEE
- perldebug - Perl debugging
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- First of all, have you tried using the ----wwww switch?
-
- TTTThhhheeee PPPPeeeerrrrllll DDDDeeeebbbbuuuuggggggggeeeerrrr
- "As soon as we started programming, we found to our surprise
- that it wasn't as easy to get programs right as we had
- thought. Debugging had to be discovered. I can remember
- the exact instant when I realized that a large part of my
- life from then on was going to be spent in finding mistakes
- in my own programs."
-
- --_M_a_u_r_i_c_e _W_i_l_k_e_s, _1_9_4_9
-
- If you invoke Perl with the ----dddd switch, your script runs
- under the Perl source debugger. This works like an
- interactive Perl environment, prompting for debugger
- commands that let you examine source code, set breakpoints,
- get stack backtraces, change the values of variables, etc.
- This is so convenient that you often fire up the debugger
- all by itself just to test out Perl constructs interactively
- to see what they do. For example:
-
- perl -d -e 42
-
- In Perl, the debugger is not a separate program as it
- usually is in the typical compiled environment. Instead,
- the ----dddd flag tells the compiler to insert source information
- into the parse trees it's about to hand off to the
- interpreter. That means your code must first compile
- correctly for the debugger to work on it. Then when the
- interpreter starts up, it preloads a Perl library file
- containing the debugger itself.
-
- The program will halt _r_i_g_h_t _b_e_f_o_r_e the first run-time
- executable statement (but see below regarding compile-time
- statements) and ask you to enter a debugger command.
- Contrary to popular expectations, whenever the debugger
- halts and shows you a line of code, it always displays the
- line it's _a_b_o_u_t to execute, rather than the one it has just
- executed.
-
- Any command not recognized by the debugger is directly
- executed (eval'd) as Perl code in the current package. (The
- debugger uses the DB package for its own state information.)
-
- Leading white space before a command would cause the
- debugger to think it's _N_O_T a debugger command but for Perl,
- so be careful not to do that.
-
-
-
-
- Page 1 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- DDDDeeeebbbbuuuuggggggggeeeerrrr CCCCoooommmmmmmmaaaannnnddddssss
-
- The debugger understands the following commands:
-
- h [command] Prints out a help message.
-
- If you supply another debugger command as an
- argument to the h command, it prints out the
- description for just that command. The special
- argument of h h produces a more compact help
- listing, designed to fit together on one screen.
-
- If the output of the h command (or any command,
- for that matter) scrolls past your screen,
- either precede the command with a leading pipe
- symbol so it's run through your pager, as in
-
- DB> |h
-
- You may change the pager which is used via O
- pager=... command.
-
- p expr Same as print {$DB::OUT} expr in the current
- package. In particular, because this is just
- Perl's own pppprrrriiiinnnntttt function, this means that
- nested data structures and objects are not
- dumped, unlike with the x command.
-
- The DB::OUT filehandle is opened to /_d_e_v/_t_t_y,
- regardless of where STDOUT may be redirected to.
-
- x expr Evaluates its expression in list context and
- dumps out the result in a pretty-printed
- fashion. Nested data structures are printed out
- recursively, unlike the print function.
-
- The details of printout are governed by multiple
- Options.
-
- V [pkg [vars]]
- Display all (or some) variables in package
- (defaulting to the main package) using a data
- pretty-printer (hashes show their keys and
- values so you see what's what, control
- characters are made printable, etc.). Make sure
- you don't put the type specifier (like $) there,
- just the symbol names, like this:
-
- V DB filename line
-
- Use ~pattern and !pattern for positive and
- negative regexps.
-
-
-
- Page 2 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- Nested data structures are printed out in a
- legible fashion, unlike the print function.
-
- The details of printout are governed by multiple
- Options.
-
- X [vars] Same as V currentpackage [vars].
-
- T Produce a stack backtrace. See below for
- details on its output.
-
- s [expr] Single step. Executes until it reaches the
- beginning of another statement, descending into
- subroutine calls. If an expression is supplied
- that includes function calls, it too will be
- single-stepped.
-
- n [expr] Next. Executes over subroutine calls, until it
- reaches the beginning of the next statement. If
- an expression is supplied that includes function
- calls, those functions will be executed with
- stops before each statement.
-
- <CR> Repeat last n or s command.
-
- c [line|sub]
- Continue, optionally inserting a one-time-only
- breakpoint at the specified line or subroutine.
-
- l List next window of lines.
-
- l min+incr List incr+1 lines starting at min.
-
- l min-max List lines min through max. l - is synonymous
- to -.
-
- l line List a single line.
-
- l subname List first window of lines from subroutine.
-
- - List previous window of lines.
-
- w [line] List window (a few lines) around the current
- line.
-
- . Return debugger pointer to the last-executed
- line and print it out.
-
- f filename Switch to viewing a different file or eval
- statement. If filename is not a full filename
- as found in values of %INC, it is considered as
- a regexp.
-
-
-
- Page 3 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- /pattern/ Search forwards for pattern; final / is
- optional.
-
- ?pattern? Search backwards for pattern; final ? is
- optional.
-
- L List all breakpoints and actions.
-
- S [[!]pattern]
- List subroutine names [not] matching pattern.
-
- t Toggle trace mode (see also AutoTrace Option).
-
- t expr Trace through execution of expr. For example:
-
- $ perl -de 42
- Stack dump during die enabled outside of evals.
-
- Loading DB routines from perl5db.pl patch level 0.94
- Emacs support available.
-
- Enter h or `h h' for help.
-
- main::(-e:1): 0
- DB<1> sub foo { 14 }
-
- DB<2> sub bar { 3 }
-
- DB<3> t print foo() * bar()
- main::((eval 172):3): print foo() + bar();
- main::foo((eval 168):2):
- main::bar((eval 170):2):
- 42
-
- or, with the Option frame=2 set,
-
- DB<4> O f=2
- frame = '2'
- DB<5> t print foo() * bar()
- 3: foo() * bar()
- entering main::foo
- 2: sub foo { 14 };
- exited main::foo
- entering main::bar
- 2: sub bar { 3 };
- exited main::bar
- 42
-
-
- b [line] [condition]
- Set a breakpoint. If line is omitted, sets a
- breakpoint on the line that is about to be
-
-
-
- Page 4 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- executed. If a condition is specified, it's
- evaluated each time the statement is reached and
- a breakpoint is taken only if the condition is
- true. Breakpoints may be set on only lines that
- begin an executable statement. Conditions don't
- use iiiiffff:
-
- b 237 $x > 30
- b 237 ++$count237 < 11
- b 33 /pattern/i
-
-
- b subname [condition]
- Set a breakpoint at the first line of the named
- subroutine.
-
- b postpone subname [condition]
- Set breakpoint at first line of subroutine after
- it is compiled.
-
- b load filename
- Set breakpoint at the first executed line of the
- file. Filename should be a full name as found
- in values of %INC.
-
- b compile subname
- Sets breakpoint at the first statement executed
- after the subroutine is compiled.
-
- d [line] Delete a breakpoint at the specified line. If
- line is omitted, deletes the breakpoint on the
- line that is about to be executed.
-
- D Delete all installed breakpoints.
-
- a [line] command
- Set an action to be done before the line is
- executed. The sequence of steps taken by the
- debugger is
-
- 1. check for a breakpoint at this line
- 2. print the line if necessary (tracing)
- 3. do any actions associated with that line
- 4. prompt user if at a breakpoint or in single-step
- 5. evaluate line
-
- For example, this will print out $foo every time
- line 53 is passed:
-
- a 53 print "DB FOUND $foo\n"
-
-
-
-
-
- Page 5 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- A Delete all installed actions.
-
- W [expr] Add a global watch-expression.
-
- W Delete all watch-expressions.
-
- O [opt[=val]] [op'val' [opt?]...
- Set or query values of options. val defaults to
- 1. opt can be abbreviated. Several options can
- be listed.
-
- recallCommand, ShellBang
- The characters used to recall
- command or spawn shell. By default,
- these are both set to !.
-
- pager Program to use for output of pager-
- piped commands (those beginning with
- a | character.) By default,
- $ENV{PAGER} will be used.
-
- tkRunning Run Tk while prompting (with
- ReadLine).
-
- signalLevel, warnLevel, dieLevel
- Level of verbosity. By default the
- debugger is in a sane verbose mode,
- thus it will print backtraces on all
- the warnings and die-messages which
- are going to be printed out, and
- will print a message when
- interesting uncaught signals arrive.
-
- To disable this behaviour, set these
- values to 0. If dieLevel is 2, then
- the messages which will be caught by
- surrounding eval are also printed.
-
- AutoTrace Trace mode (similar to t command,
- but can be put into PERLDB_OPTS).
-
- LineInfo File or pipe to print line number
- info to. If it is a pipe (say,
- |visual_perl_db), then a short,
- "emacs like" message is used.
-
- inhibit_exit If 0, allows _s_t_e_p_p_i_n_g _o_f_f the end of
- the script.
-
- PrintRet affects printing of return value
- after r command.
-
-
-
-
- Page 6 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- ornaments affects screen appearance of the
- command line (see the _T_e_r_m::_R_e_a_d_L_i_n_e
- manpage).
-
- frame affects printing messages on entry
- and exit from subroutines. If frame
- & 2 is false, messages are printed
- on entry only. (Printing on exit may
- be useful if _i_n_t_e_r(di)spersed with
- other messages.)
-
- If frame & 4, arguments to functions
- are printed as well as the context
- and caller info. If frame & 8,
- overloaded stringify and tied FETCH
- are enabled on the printed
- arguments. If frame & 16, the return
- value from the subroutine is printed
- as well.
-
- The length at which the argument
- list is truncated is governed by the
- next option:
-
- maxTraceLen length at which the argument list is
- truncated when frame option's bit 4
- is set.
-
- The following options affect what
- happens with V, X, and x commands:
-
- arrayDepth, hashDepth Print only first N elements ('' for
- all).
-
- compactDump, veryCompact
- Change style of array and hash dump.
- If compactDump, short array may be
- printed on one line.
-
- globPrint Whether to print contents of globs.
-
- DumpDBFiles Dump arrays holding debugged files.
-
- DumpPackages Dump symbol tables of packages.
-
- DumpReused Dump contents of "reused" addresses.
-
- quote, HighBit, undefPrint
- Change style of string dump.
- Default value of quote is auto, one
- can enable either double-quotish
- dump, or single-quotish by setting
-
-
-
- Page 7 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- it to " or '. By default,
- characters with high bit set are
- printed _a_s _i_s.
-
- UsageOnly _v_e_r_y rudimentally per-package memory
- usage dump. Calculates total size
- of strings in variables in the
- package.
-
- During startup options are
- initialized from $ENV{PERLDB_OPTS}.
- You can put additional
- initialization options TTY, noTTY,
- ReadLine, and NonStop there.
-
- Example rc file:
-
- &parse_options("NonStop=1 LineInfo=db.out AutoTrace");
-
- The script will run without human
- intervention, putting trace
- information into the file _d_b._o_u_t.
- (If you interrupt it, you would
- better reset LineInfo to something
- "interactive"!)
-
- TTY The TTY to use for debugging I/O.
-
- noTTY If set, goes in NonStop mode, and
- would not connect to a TTY. If
- interrupt (or if control goes to
- debugger via explicit setting of
- $DB::signal or $DB::single from the
- Perl script), connects to a TTY
- specified by the TTY option at
- startup, or to a TTY found at
- runtime using Term::Rendezvous
- module of your choice.
-
- This module should implement a
- method new which returns an object
- with two methods: IN and OUT,
- returning two filehandles to use for
- debugging input and output
- correspondingly. Method new may
- inspect an argument which is a value
- of $ENV{PERLDB_NOTTY} at startup, or
- is "/tmp/perldbtty$$" otherwise.
-
- ReadLine If false, readline support in
- debugger is disabled, so you can
- debug ReadLine applications.
-
-
-
- Page 8 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- NonStop If set, debugger goes into
- noninteractive mode until
- interrupted, or programmatically by
- setting $DB::signal or $DB::single.
-
- Here's an example of using the
- $ENV{PERLDB_OPTS} variable:
-
- $ PERLDB_OPTS="N f=2" perl -d myprogram
-
- will run the script myprogram
- without human intervention, printing
- out the call tree with entry and
- exit points. Note that N f=2 is
- equivalent to NonStop=1 frame=2.
- Note also that at the moment when
- this documentation was written all
- the options to the debugger could be
- uniquely abbreviated by the first
- letter (with exception of Dump*
- options).
-
- Other examples may include
-
- $ PERLDB_OPTS="N f A L=listing" perl -d myprogram
-
- - runs script noninteractively,
- printing info on each entry into a
- subroutine and each executed line
- into the file _l_i_s_t_i_n_g. (If you
- interrupt it, you would better reset
- LineInfo to something
- "interactive"!)
-
- $ env "PERLDB_OPTS=R=0 TTY=/dev/ttyc" perl -d myprogram
-
- may be useful for debugging a
- program which uses Term::ReadLine
- itself. Do not forget detach shell
- from the TTY in the window which
- corresponds to /_d_e_v/_t_t_y_c, say, by
- issuing a command like
-
- $ sleep 1000000
-
- See the section on _D_e_b_u_g_g_e_r
- _I_n_t_e_r_n_a_l_s below for more details.
-
- < [ command ]
- Set an action (Perl command) to happen before
- every debugger prompt. A multi-line command may
- be entered by backslashing the newlines. If
-
-
-
- Page 9 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- command is missing, resets the list of actions.
-
- << command Add an action (Perl command) to happen before
- every debugger prompt. A multi-line command may
- be entered by backslashing the newlines.
-
- > command Set an action (Perl command) to happen after the
- prompt when you've just given a command to
- return to executing the script. A multi-line
- command may be entered by backslashing the
- newlines. If command is missing, resets the
- list of actions.
-
- >> command Adds an action (Perl command) to happen after
- the prompt when you've just given a command to
- return to executing the script. A multi-line
- command may be entered by backslashing the
- newlines.
-
- { [ command ]
- Set an action (debugger command) to happen
- before every debugger prompt. A multi-line
- command may be entered by backslashing the
- newlines. If command is missing, resets the
- list of actions.
-
- {{ command Add an action (debugger command) to happen
- before every debugger prompt. A multi-line
- command may be entered by backslashing the
- newlines.
-
- ! number Redo a previous command (default previous
- command).
-
- ! -number Redo number'th-to-last command.
-
- ! pattern Redo last command that started with pattern.
- See O recallCommand, too.
-
- !! cmd Run cmd in a subprocess (reads from DB::IN,
- writes to DB::OUT) See O shellBang too.
-
- H -number Display last n commands. Only commands longer
- than one character are listed. If number is
- omitted, lists them all.
-
- q or ^D Quit. ("quit" doesn't work for this.) This is
- the only supported way to exit the debugger,
- though typing exit twice may do it too.
-
- Set an Option inhibit_exit to 0 if you want to
- be able to _s_t_e_p _o_f_f the end the script. You may
-
-
-
- Page 10 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- also need to set $finished to 0 at some moment
- if you want to step through global destruction.
-
- R Restart the debugger by eeeexxxxeeeeccccing a new session.
- It tries to maintain your history across this,
- but internal settings and command line options
- may be lost.
-
- Currently the following setting are preserved:
- history, breakpoints, actions, debugger Options,
- and the following command line options: ----wwww, ----IIII,
- and ----eeee.
-
- |dbcmd Run debugger command, piping DB::OUT to current
- pager.
-
- ||dbcmd Same as |dbcmd but DB::OUT is temporarily
- sssseeeelllleeeecccctttted as well. Often used with commands that
- would otherwise produce long output, such as
-
- |V main
-
-
- = [alias value]
- Define a command alias, like
-
- = quit q
-
- or list current aliases.
-
- command Execute command as a Perl statement. A missing
- semicolon will be supplied.
-
- m expr The expression is evaluated, and the methods
- which may be applied to the result are listed.
-
- m package The methods which may be applied to objects in
- the package are listed.
-
- DDDDeeeebbbbuuuuggggggggeeeerrrr iiiinnnnppppuuuutttt////oooouuuuttttppppuuuutttt
-
- Prompt The debugger prompt is something like
-
- DB<8>
-
- or even
-
- DB<<17>>
-
- where that number is the command number, which you'd
- use to access with the builtin ccccsssshhhh-like history
- mechanism, e.g., !17 would repeat command number 17.
-
-
-
- Page 11 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- The number of angle brackets indicates the depth of
- the debugger. You could get more than one set of
- brackets, for example, if you'd already at a
- breakpoint and then printed out the result of a
- function call that itself also has a breakpoint, or
- you step into an expression via s/n/t expression
- command.
-
- Multiline commands
- If you want to enter a multi-line command, such as a
- subroutine definition with several statements, or a
- format, you may escape the newline that would
- normally end the debugger command with a backslash.
- Here's an example:
-
- DB<1> for (1..4) { \
- cont: print "ok\n"; \
- cont: }
- ok
- ok
- ok
- ok
-
- Note that this business of escaping a newline is
- specific to interactive commands typed into the
- debugger.
-
- Stack backtrace
- Here's an example of what a stack backtrace via T
- command might look like:
-
- $ = main::infested called from file `Ambulation.pm' line 10
- @ = Ambulation::legs(1, 2, 3, 4) called from file `camel_flea' line 7
- $ = main::pests('bactrian', 4) called from file `camel_flea' line 4
-
- The left-hand character up there tells whether the
- function was called in a scalar or list context (we
- bet you can tell which is which). What that says is
- that you were in the function main::infested when
- you ran the stack dump, and that it was called in a
- scalar context from line 10 of the file
- _A_m_b_u_l_a_t_i_o_n._p_m, but without any arguments at all,
- meaning it was called as &infested. The next stack
- frame shows that the function Ambulation::legs was
- called in a list context from the _c_a_m_e_l__f_l_e_a file
- with four arguments. The last stack frame shows
- that main::pests was called in a scalar context,
- also from _c_a_m_e_l__f_l_e_a, but from line 4.
-
- Note that if you execute T command from inside an
- active use statement, the backtrace will contain
- both require frame and an eval) frame.
-
-
-
- Page 12 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- Listing Listing given via different flavors of l command
- looks like this:
-
- DB<<13>> l
- 101: @i{@i} = ();
- 102:b @isa{@i,$pack} = ()
- 103 if(exists $i{$prevpack} || exists $isa{$pack});
- 104 }
- 105
- 106 next
- 107==> if(exists $isa{$pack});
- 108
- 109:a if ($extra-- > 0) {
- 110: %isa = ($pack,1);
-
- Note that the breakable lines are marked with :,
- lines with breakpoints are marked by b, with actions
- by a, and the next executed line is marked by ==>.
-
- Frame listing
- When frame option is set, debugger would print
- entered (and optionally exited) subroutines in
- different styles.
-
- What follows is the start of the listing of
-
- env "PERLDB_OPTS=f=n N" perl -d -V
-
- for different values of n:
-
- 1
-
- entering main::BEGIN
- entering Config::BEGIN
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- Package lib/Config.pm.
- entering Config::TIEHASH
- entering Exporter::import
- entering Exporter::export
- entering Config::myconfig
- entering Config::FETCH
- entering Config::FETCH
- entering Config::FETCH
- entering Config::FETCH
-
-
- 2
-
-
-
-
-
-
-
- Page 13 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- entering main::BEGIN
- entering Config::BEGIN
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- exited Config::BEGIN
- Package lib/Config.pm.
- entering Config::TIEHASH
- exited Config::TIEHASH
- entering Exporter::import
- entering Exporter::export
- exited Exporter::export
- exited Exporter::import
- exited main::BEGIN
- entering Config::myconfig
- entering Config::FETCH
- exited Config::FETCH
- entering Config::FETCH
- exited Config::FETCH
- entering Config::FETCH
-
-
- 4
-
- in $=main::BEGIN() from /dev/nul:0
- in $=Config::BEGIN() from lib/Config.pm:2
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- Package lib/Config.pm.
- in $=Config::TIEHASH('Config') from lib/Config.pm:644
- in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from li
- in @=Config::myconfig() from /dev/nul:0
- in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'PATCHLEVEL') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'SUBVERSION') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'osname') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'osvers') from lib/Config.pm:574
-
-
- 6
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 14 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- in $=main::BEGIN() from /dev/nul:0
- in $=Config::BEGIN() from lib/Config.pm:2
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- out $=Config::BEGIN() from lib/Config.pm:0
- Package lib/Config.pm.
- in $=Config::TIEHASH('Config') from lib/Config.pm:644
- out $=Config::TIEHASH('Config') from lib/Config.pm:644
- in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
- out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/
- out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- out $=main::BEGIN() from /dev/nul:0
- in @=Config::myconfig() from /dev/nul:0
- in $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
- out $=Config::FETCH(ref(Config), 'package') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
- out $=Config::FETCH(ref(Config), 'baserev') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'PATCHLEVEL') from lib/Config.pm:574
- out $=Config::FETCH(ref(Config), 'PATCHLEVEL') from lib/Config.pm:574
- in $=Config::FETCH(ref(Config), 'SUBVERSION') from lib/Config.pm:574
-
-
- 14
-
- in $=main::BEGIN() from /dev/nul:0
- in $=Config::BEGIN() from lib/Config.pm:2
- Package lib/Exporter.pm.
- Package lib/Carp.pm.
- out $=Config::BEGIN() from lib/Config.pm:0
- Package lib/Config.pm.
- in $=Config::TIEHASH('Config') from lib/Config.pm:644
- out $=Config::TIEHASH('Config') from lib/Config.pm:644
- in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
- out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/E
- out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/nul:0
- out $=main::BEGIN() from /dev/nul:0
- in @=Config::myconfig() from /dev/nul:0
- in $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
- out $=Config::FETCH('Config=HASH(0x1aa444)', 'package') from lib/Config.pm:574
- in $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
- out $=Config::FETCH('Config=HASH(0x1aa444)', 'baserev') from lib/Config.pm:574
-
-
- 30
-
-
-
-
-
-
-
-
-
- Page 15 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- in $=CODE(0x15eca4)() from /dev/null:0
- in $=CODE(0x182528)() from lib/Config.pm:2
- Package lib/Exporter.pm.
- out $=CODE(0x182528)() from lib/Config.pm:0
- scalar context return from CODE(0x182528): undef
- Package lib/Config.pm.
- in $=Config::TIEHASH('Config') from lib/Config.pm:628
- out $=Config::TIEHASH('Config') from lib/Config.pm:628
- scalar context return from Config::TIEHASH: empty hash
- in $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
- in $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
- out $=Exporter::export('Config', 'main', 'myconfig', 'config_vars') from lib/Exporter.pm:171
- scalar context return from Exporter::export: ''
- out $=Exporter::import('Config', 'myconfig', 'config_vars') from /dev/null:0
- scalar context return from Exporter::import: ''
-
-
- In all the cases indentation of lines shows the
- call tree, if bit 2 of frame is set, then a line
- is printed on exit from a subroutine as well, if
- bit 4 is set, then the arguments are printed as
- well as the caller info, if bit 8 is set, the
- arguments are printed even if they are tied or
- references, if bit 16 is set, the return value
- is printed as well.
-
- When a package is compiled, a line like this
-
- Package lib/Carp.pm.
-
- is printed with proper indentation.
-
- DDDDeeeebbbbuuuuggggggggiiiinnnngggg ccccoooommmmppppiiiilllleeee----ttttiiiimmmmeeee ssssttttaaaatttteeeemmmmeeeennnnttttssss
-
- If you have any compile-time executable statements (code
- within a BEGIN block or a use statement), these will NOT be
- stopped by debugger, although requires will (and compile-
- time statements can be traced with AutoTrace option set in
- PERLDB_OPTS). From your own Perl code, however, you can
- transfer control back to the debugger using the following
- statement, which is harmless if the debugger is not running:
-
- $DB::single = 1;
-
- If you set $DB::single to the value 2, it's equivalent to
- having just typed the n command, whereas a value of 1 means
- the s command. The $DB::trace variable should be set to 1
- to simulate having typed the t command.
-
- Another way to debug compile-time code is to start debugger,
- set a breakpoint on _l_o_a_d of some module thusly
-
-
-
-
- Page 16 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- DB<7> b load f:/perllib/lib/Carp.pm
- Will stop on load of `f:/perllib/lib/Carp.pm'.
-
- and restart debugger by R command (if possible). One can
- use b compile subname for the same purpose.
-
- DDDDeeeebbbbuuuuggggggggeeeerrrr CCCCuuuussssttttoooommmmiiiizzzzaaaattttiiiioooonnnn
-
- Most probably you do not want to modify the debugger, it
- contains enough hooks to satisfy most needs. You may change
- the behaviour of debugger from the debugger itself, using
- Options, from the command line via PERLDB_OPTS environment
- variable, and from _c_u_s_t_o_m_i_z_a_t_i_o_n _f_i_l_e_s.
-
- You can do some customization by setting up a ._p_e_r_l_d_b file
- which contains initialization code. For instance, you could
- make aliases like these (the last one is one people expect
- to be there):
-
- $DB::alias{'len'} = 's/^len(.*)/p length($1)/';
- $DB::alias{'stop'} = 's/^stop (at|in)/b/';
- $DB::alias{'ps'} = 's/^ps\b/p scalar /';
- $DB::alias{'quit'} = 's/^quit(\s*)/exit\$/';
-
- One changes options from ._p_e_r_l_d_b file via calls like this
- one;
-
- parse_options("NonStop=1 LineInfo=db.out AutoTrace=1 frame=2");
-
- (the code is executed in the package DB). Note that ._p_e_r_l_d_b
- is processed before processing PERLDB_OPTS. If ._p_e_r_l_d_b
- defines the subroutine afterinit, it is called after all the
- debugger initialization ends. ._p_e_r_l_d_b may be contained in
- the current directory, or in the LOGDIR/HOME directory.
-
- If you want to modify the debugger, copy _p_e_r_l_5_d_b._p_l from the
- Perl library to another name and modify it as necessary.
- You'll also want to set your PERL5DB environment variable to
- say something like this:
-
- BEGIN { require "myperl5db.pl" }
-
- As the last resort, one can use PERL5DB to customize
- debugger by directly setting internal variables or calling
- debugger functions.
-
- RRRReeeeaaaaddddlllliiiinnnneeee SSSSuuuuppppppppoooorrrrtttt
-
- As shipped, the only command line history supplied is a
- simplistic one that checks for leading exclamation points.
- However, if you install the Term::ReadKey and Term::ReadLine
- modules from CPAN, you will have full editing capabilities
-
-
-
- Page 17 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- much like GNU _r_e_a_d_l_i_n_e(3) provides. Look for these in the
- _m_o_d_u_l_e_s/_b_y-_m_o_d_u_l_e/_T_e_r_m directory on CPAN.
-
- A rudimentary command line completion is also available.
- Unfortunately, the names of lexical variables are not
- available for completion.
-
- EEEEddddiiiittttoooorrrr SSSSuuuuppppppppoooorrrrtttt ffffoooorrrr DDDDeeeebbbbuuuuggggggggiiiinnnngggg
-
- If you have GNU eeeemmmmaaaaccccssss installed on your system, it can
- interact with the Perl debugger to provide an integrated
- software development environment reminiscent of its
- interactions with C debuggers.
-
- Perl is also delivered with a start file for making eeeemmmmaaaaccccssss
- act like a syntax-directed editor that understands (some of)
- Perl's syntax. Look in the _e_m_a_c_s directory of the Perl
- source distribution.
-
- (Historically, a similar setup for interacting with vvvviiii and
- the X11 window system had also been available, but at the
- time of this writing, no debugger support for vvvviiii currently
- exists.)
-
- TTTThhhheeee PPPPeeeerrrrllll PPPPrrrrooooffffiiiilllleeeerrrr
-
- If you wish to supply an alternative debugger for Perl to
- run, just invoke your script with a colon and a package
- argument given to the ----dddd flag. One of the most popular
- alternative debuggers for Perl is DDDDPPPPrrrrooooffff, the Perl profiler.
- As of this writing, DDDDPPPPrrrrooooffff is not included with the standard
- Perl distribution, but it is expected to be included soon,
- for certain values of "soon".
-
- Meanwhile, you can fetch the Devel::Dprof module from CPAN.
- Assuming it's properly installed on your system, to profile
- your Perl program in the file _m_y_c_o_d_e._p_l, just type:
-
- perl -d:DProf mycode.pl
-
- When the script terminates the profiler will dump the
- profile information to a file called _t_m_o_n._o_u_t. A tool like
- ddddpppprrrrooooffffpppppppp (also supplied with the Devel::DProf package) can be
- used to interpret the information which is in that profile.
-
- DDDDeeeebbbbuuuuggggggggeeeerrrr ssssuuuuppppppppoooorrrrtttt iiiinnnn ppppeeeerrrrllll
-
- When you call the ccccaaaalllllllleeeerrrr function (see the caller entry in
- the _p_e_r_l_f_u_n_c manpage) from the package DB, Perl sets the
- array @DB::args to contain the arguments the corresponding
- stack frame was called with.
-
-
-
-
- Page 18 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- If perl is run with ----dddd option, the following additional
- features are enabled (cf. the section on $^_P in the _p_e_r_l_v_a_r
- manpage):
-
- +o Perl inserts the contents of $ENV{PERL5DB} (or BEGIN
- {require 'perl5db.pl'} if not present) before the first
- line of the application.
-
- +o The array @{"_<$filename"} is the line-by-line contents
- of $filename for all the compiled files. Same for
- evaled strings which contain subroutines, or which are
- currently executed. The $filename for evaled strings
- looks like (eval 34).
-
- +o The hash %{"_<$filename"} contains breakpoints and
- action (it is keyed by line number), and individual
- entries are settable (as opposed to the whole hash).
- Only true/false is important to Perl, though the values
- used by _p_e_r_l_5_d_b._p_l have the form
- "$break_condition\0$action". Values are magical in
- numeric context: they are zeros if the line is not
- breakable.
-
- Same for evaluated strings which contain subroutines,
- or which are currently executed. The $filename for
- evaled strings looks like (eval 34).
-
- +o The scalar ${"_<$filename"} contains "_<$filename".
- Same for evaluated strings which contain subroutines,
- or which are currently executed. The $filename for
- evaled strings looks like (eval 34).
-
- +o After each required file is compiled, but before it is
- executed, DB::postponed(*{"_<$filename"}) is called (if
- subroutine DB::postponed exists). Here the $filename
- is the expanded name of the required file (as found in
- values of %INC).
-
- +o After each subroutine subname is compiled existence of
- $DB::postponed{subname} is checked. If this key
- exists, DB::postponed(subname) is called (if subroutine
- DB::postponed exists).
-
- +o A hash %DB::sub is maintained, with keys being
- subroutine names, values having the form
- filename:startline-endline. filename has the form
- (eval 31) for subroutines defined inside evals.
-
- +o When execution of the application reaches a place that
- can have a breakpoint, a call to DB::DB() is performed
- if any one of variables $DB::trace, $DB::single, or
- $DB::signal is true. (Note that these variables are not
-
-
-
- Page 19 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- localizable.) This feature is disabled when the control
- is inside DB::DB() or functions called from it (unless
- $^D & (1<<30)).
-
- +o When execution of the application reaches a subroutine
- call, a call to &DB::sub(_a_r_g_s) is performed instead,
- with $DB::sub being the name of the called subroutine.
- (Unless the subroutine is compiled in the package DB.)
-
- Note that if &DB::sub needs some external data to be setup
- for it to work, no subroutine call is possible until this is
- done. For the standard debugger $DB::deep (how many levels
- of recursion deep into the debugger you can go before a
- mandatory break) gives an example of such a dependency.
-
- The minimal working debugger consists of one line
-
- sub DB::DB {}
-
- which is quite handy as contents of PERL5DB environment
- variable:
-
- env "PERL5DB=sub DB::DB {}" perl -d your-script
-
- Another (a little bit more useful) minimal debugger can be
- created with the only line being
-
- sub DB::DB {print ++$i; scalar <STDIN>}
-
- This debugger would print the sequential number of
- encountered statement, and would wait for your CR to
- continue.
-
- The following debugger is quite functional:
-
- {
- package DB;
- sub DB {}
- sub sub {print ++$i, " $sub\n"; &$sub}
- }
-
- It prints the sequential number of subroutine call and the
- name of the called subroutine. Note that &DB::sub should be
- compiled into the package DB.
-
- DDDDeeeebbbbuuuuggggggggeeeerrrr IIIInnnntttteeeerrrrnnnnaaaallllssss
-
- At the start, the debugger reads your rc file (./._p_e_r_l_d_b or
- ~/._p_e_r_l_d_b under Unix), which can set important options.
- This file may define a subroutine &afterinit to be executed
- after the debugger is initialized.
-
-
-
-
- Page 20 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- After the rc file is read, the debugger reads environment
- variable PERLDB_OPTS and parses it as a rest of O ... line
- in debugger prompt.
-
- It also maintains magical internal variables, such as
- @DB::dbline, %DB::dbline, which are aliases for
- @{"::_<current_file"} %{"::_<current_file"}. Here
- current_file is the currently selected (with the debugger's
- f command, or by flow of execution) file.
-
- Some functions are provided to simplify customization. See
- the section on _D_e_b_u_g_g_e_r _C_u_s_t_o_m_i_z_a_t_i_o_n for description of
- DB::parse_options(string). The function
- DB::dump_trace(skip[, count]) skips the specified number of
- frames, and returns a list containing info about the caller
- frames (all if count is missing). Each entry is a hash with
- keys context ($ or @), sub (subroutine name, or info about
- eval), args (undef or a reference to an array), file, and
- line.
-
- The function DB::print_trace(FH, skip[, count[, short]])
- prints formatted info about caller frames. The last two
- functions may be convenient as arguments to <, << commands.
-
- OOOOtttthhhheeeerrrr rrrreeeessssoooouuuurrrrcccceeeessss
-
- You did try the ----wwww switch, didn't you?
-
- BBBBUUUUGGGGSSSS
-
- You cannot get the stack frame information or otherwise
- debug functions that were not compiled by Perl, such as C or
- C++ extensions.
-
- If you alter your @_ arguments in a subroutine (such as with
- sssshhhhiiiifffftttt or ppppoooopppp, the stack backtrace will not show the original
- values.
-
- DDDDeeeebbbbuuuuggggggggiiiinnnngggg PPPPeeeerrrrllll mmmmeeeemmmmoooorrrryyyy uuuussssaaaaggggeeee
- Perl is _v_e_r_y frivolous with memory. There is a saying that
- to estimate memory usage of Perl, assume a reasonable
- algorithm of allocation, and multiply your estimages by 10.
- This is not absolutely true, but may give you a good grasp
- of what happens.
-
- Say, an integer cannot take less than 20 bytes of memory, a
- float cannot take less than 24 bytes, a string cannot take
- less than 32 bytes (all these examples assume 32-bit
- architectures, the result are much worse on 64-bit
- architectures). If a variable is accessed in two of three
- different ways (which require an integer, a float, or a
- string), the memory footprint may increase by another 20
-
-
-
- Page 21 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- bytes. A sloppy _m_a_l_l_o_c() implementation will make these
- numbers yet more.
-
- On the opposite end of the scale, a declaration like
-
- sub foo;
-
- may take (on some versions of perl) up to 500 bytes of
- memory.
-
- Off-the-cuff anecdotal estimates of a code bloat give a
- factor around 8. This means that the compiled form of
- reasonable (commented indented etc.) code will take
- approximately 8 times more than the disk space the code
- takes.
-
- There are two Perl-specific ways to analyze the memory
- usage: $ENV{PERL_DEBUG_MSTATS} and ----DDDDLLLL switch. First one
- is available only if perl is compiled with Perl's _m_a_l_l_o_c(),
- the second one only if Perl compiled with -DDEBUGGING (as
- with giving -D optimise=-g option to _C_o_n_f_i_g_u_r_e).
-
- UUUUssssiiiinnnngggg $$$$EEEENNNNVVVV{{{{PPPPEEEERRRRLLLL____DDDDEEEEBBBBUUUUGGGG____MMMMSSSSTTTTAAAATTTTSSSS}}}}
-
- If your perl is using Perl's _m_a_l_l_o_c(), and compiled with
- correct switches (this is the default), then it will print
- memory usage statistics after compiling your code (if
- $ENV{PERL_DEBUG_MSTATS} > 1), and before termination of the
- script (if $ENV{PERL_DEBUG_MSTATS} >= 1). The report format
- is similar to one in the following example:
-
- env PERL_DEBUG_MSTATS=2 perl -e "require Carp"
- Memory allocation statistics after compilation: (buckets 4(4)..8188(8192)
- 14216 free: 130 117 28 7 9 0 2 2 1 0 0
- 437 61 36 0 5
- 60924 used: 125 137 161 55 7 8 6 16 2 0 1
- 74 109 304 84 20
- Total sbrk(): 77824/21:119. Odd ends: pad+heads+chain+tail: 0+636+0+2048.
- Memory allocation statistics after execution: (buckets 4(4)..8188(8192)
- 30888 free: 245 78 85 13 6 2 1 3 2 0 1
- 315 162 39 42 11
- 175816 used: 265 176 1112 111 26 22 11 27 2 1 1
- 196 178 1066 798 39
- Total sbrk(): 215040/47:145. Odd ends: pad+heads+chain+tail: 0+2192+0+6144.
-
- It is possible to ask for such a statistic at arbitrary
- moment by usind _D_e_v_e_l::_P_e_e_k::_m_s_t_a_t_s() (module Devel::Peek is
- available on CPAN).
-
- Here is the explanation of different parts of the format:
-
-
-
-
-
- Page 22 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- buckets SMALLEST(APPROX)..GREATEST(APPROX)
- Perl's _m_a_l_l_o_c() uses bucketed allocations. Every
- request is rounded up to the closest bucket size
- available, and a bucket of these size is taken from the
- pool of the buckets of this size.
-
- The above line describes limits of buckets currently in
- use. Each bucket has two sizes: memory footprint, and
- the maximal size of user data which may be put into
- this bucket. Say, in the above example the smallest
- bucket is both sizes 4. The biggest bucket has usable
- size 8188, and the memory footprint 8192.
-
- With debugging Perl some buckets may have negative
- usable size. This means that these buckets cannot (and
- will not) be used. For greater buckets the memory
- footprint may be one page greater than a power of 2.
- In such a case the corresponding power of two is
- printed instead in the APPROX field above.
-
- Free/Used
- The following 1 or 2 rows of numbers correspond to the
- number of buckets of each size between SMALLEST and
- GREATEST. In the first row the sizes (memory
- footprints) of buckets are powers of two (or possibly
- one page greater). In the second row (if present) the
- memory footprints of the buckets are between memory
- footprints of two buckets "above".
-
- Say, with the above example the memory footprints are
- (with current algorith)
-
- free: 8 16 32 64 128 256 512 1024 2048 4096 8192
- 4 12 24 48 80
-
- With non-DEBUGGING perl the buckets starting from
- 128-long ones have 4-byte overhead, thus 8192-long
- bucket may take up to 8188-byte-long allocations.
-
- Total sbrk(): SBRKed/SBRKs:CONTINUOUS
- The first two fields give the total amount of memory
- perl _s_b_r_k()ed, and number of _s_b_r_k()s used. The third
- number is what perl thinks about continuity of returned
- chunks. As far as this number is positive, _m_a_l_l_o_c()
- will assume that it is probable that _s_b_r_k() will
- provide continuous memory.
-
- The amounts _s_b_r_k()ed by external libraries is not
- counted.
-
- pad: 0
- The amount of _s_b_r_k()ed memory needed to keep buckets
-
-
-
- Page 23 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- aligned.
-
- heads: 2192
- While memory overhead of bigger buckets is kept inside
- the bucket, for smaller buckets it is kept in separate
- areas. This field gives the total size of these areas.
-
- chain: 0
- _m_a_l_l_o_c() may want to subdivide a bigger bucket into
- smaller buckets. If only a part of the deceased-bucket
- is left non-subdivided, the rest is kept as an element
- of a linked list. This field gives the total size of
- these chunks.
-
- tail: 6144
- To minimize amount of _s_b_r_k()s _m_a_l_l_o_c() asks for more
- memory. This field gives the size of the yet-unused
- part, which is _s_b_r_k()ed, but never touched.
-
- EEEExxxxaaaammmmpppplllleeee ooooffff uuuussssiiiinnnngggg ----DDDDLLLL switch
-
- Below we show how to analyse memory usage by
-
- do 'lib/auto/POSIX/autosplit.ix';
-
- The file in question contains a header and 146 lines similar
- to
-
- sub getcwd ;
-
- NNNNooootttteeee:::: _t_h_e _d_i_s_c_u_s_s_i_o_n _b_e_l_o_w _s_u_p_p_o_s_e_s _3_2-_b_i_t _a_r_c_h_i_t_e_c_t_u_r_e. _I_n
- _t_h_e _n_e_w_e_r _v_e_r_s_i_o_n_s _o_f _p_e_r_l _t_h_e _m_e_m_o_r_y _u_s_a_g_e _o_f _t_h_e
- _c_o_n_s_t_r_u_c_t_s _d_i_s_c_u_s_s_e_d _h_e_r_e _i_s _m_u_c_h _i_m_p_r_o_v_e_d, _b_u_t _t_h_e _s_t_o_r_y
- _d_i_s_c_u_s_s_e_d _b_e_l_o_w _i_s _a _r_e_a_l-_l_i_f_e _s_t_o_r_y. _T_h_i_s _s_t_o_r_y _i_s _v_e_r_y
- _t_e_r_s_e, _a_n_d _a_s_s_u_m_e_s _m_o_r_e _t_h_a_n _c_u_r_s_o_r_y _k_n_o_w_l_e_d_g_e _o_f _P_e_r_l
- _i_n_t_e_r_n_a_l_s.
-
- Here is the itemized list of Perl allocations performed
- during parsing of this file:
-
- !!! "after" at test.pl line 3.
- Id subtot 4 8 12 16 20 24 28 32 36 40 48 56 64 72 80 80+
- 0 02 13752 . . . . 294 . . . . . . . . . . 4
- 0 54 5545 . . 8 124 16 . . . 1 1 . . . . . 3
- 5 05 32 . . . . . . . 1 . . . . . . . .
- 6 02 7152 . . . . . . . . . . 149 . . . . .
- 7 02 3600 . . . . . 150 . . . . . . . . . .
- 7 03 64 . -1 . 1 . . 2 . . . . . . . . .
- 7 04 7056 . . . . . . . . . . . . . . . 7
- 7 17 38404 . . . . . . . 1 . . 442 149 . . 147 .
- 9 03 2078 17 249 32 . . . . 2 . . . . . . . .
-
-
-
-
- Page 24 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- To see this list insert two warn('!...') statements around
- the call:
-
- warn('!');
- do 'lib/auto/POSIX/autosplit.ix';
- warn('!!! "after"');
-
- and run it with ----DDDDLLLL option. The first _w_a_r_n() will print
- memory allocation info before the parsing of the file, and
- will memorize the statistics at this point (we ignore what
- it prints). The second _w_a_r_n() will print increments w.r.t.
- this memorized statistics. This is the above printout.
-
- Different _I_ds on the left correspond to different subsystems
- of perl interpreter, they are just first argument given to
- perl memory allocation API _N_e_w(). To find what 9 03 means
- grep the perl source for 903. You will see that it is
- _u_t_i_l._c, function _s_a_v_e_p_v_n(). This function is used to store
- a copy of existing chunk of memory. Using C debugger, one
- can see that it is called either directly from _g_v__i_n_i_t(), or
- via _s_v__m_a_g_i_c(), and _g_v__i_n_i_t() is called from _g_v__f_e_t_c_h_p_v() -
- which is called from _n_e_w_S_U_B().
-
- NNNNooootttteeee:::: to reach this place in debugger and skip all the calls
- to savepvn during the compilation of the main script, set a
- C breakpoint in _P_e_r_l__w_a_r_n(), continue this point is reached,
- _t_h_e_n set breakpoint in _P_e_r_l__s_a_v_e_p_v_n(). Note that you may
- need to skip a handful of _P_e_r_l__s_a_v_e_p_v_n() which do not
- correspond to mass production of CVs (there are more 903
- allocations than 146 similar lines of
- _l_i_b/_a_u_t_o/_P_O_S_I_X/_a_u_t_o_s_p_l_i_t._i_x). Note also that Perl_ prefixes
- are added by macroization code in perl header files to avoid
- conflicts with external libraries.
-
- Anyway, we see that 903 ids correspond to creation of globs,
- twice per glob - for glob name, and glob stringification
- magic.
-
- Here are explanations for other _I_ds above:
-
- 717 is for creation of bigger XPV* structures. In the
- above case it creates 3 AV per subroutine, one for a
- list of lexical variable names, one for a scratchpad
- (which contains lexical variables and targets), and one
- for the array of scratchpads needed for recursion.
-
- It also creates a GV and a CV per subroutine (all
- called from _s_t_a_r_t__s_u_b_p_a_r_s_e()).
-
- 002 Creates C array corresponding to the AV of scratchpads,
- and the scratchpad itself (the first fake entry of this
- scratchpad is created though the subroutine itself is
-
-
-
- Page 25 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- not defined yet).
-
- It also creates C arrays to keep data for the stash
- (this is one HV, but it grows, thus there are 4 big
- allocations: the big chunks are not freeed, but are
- kept as additional arenas for SV allocations).
-
- 054 creates a HEK for the name of the glob for the
- subroutine (this name is a key in a _s_t_a_s_h).
-
- Big allocations with this _I_d correspond to allocations
- of new arenas to keep HE.
-
- 602 creates a GP for the glob for the subroutine.
-
- 702 creates the MAGIC for the glob for the subroutine.
-
- 704 creates _a_r_e_n_a_s which keep SVs.
-
- ----DDDDLLLL details
-
- If Perl is run with ----DDDDLLLL option, then _w_a_r_n()s which start
- with `!' behave specially. They print a list of _c_a_t_e_g_o_r_i_e_s
- of memory allocations, and statistics of allocations of
- different sizes for these categories.
-
- If _w_a_r_n() string starts with
-
- !!! print changed categories only, print the differences in
- counts of allocations;
-
- !! print grown categories only; print the absolute values
- of counts, and totals;
-
- ! print nonempty categories, print the absolute values of
- counts and totals.
-
- LLLLiiiimmmmiiiittttaaaattttiiiioooonnnnssss ooooffff ----DDDDLLLL statistic
-
- If an extension or an external library does not use Perl API
- to allocate memory, these allocations are not counted.
-
- DDDDeeeebbbbuuuuggggggggiiiinnnngggg rrrreeeegggguuuullllaaaarrrr eeeexxxxpppprrrreeeessssssssiiiioooonnnnssss
- There are two ways to enable debugging output for regular
- expressions.
-
- If your perl is compiled with -DDEBUGGING, you may use the
- ----DDDDrrrr flag on the command line.
-
- Otherwise, one can use re 'debug', which has effects both at
- compile time, and at run time (and is _n_o_t lexically scoped).
-
-
-
-
- Page 26 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- CCCCoooommmmppppiiiilllleeee----ttttiiiimmmmeeee oooouuuuttttppppuuuutttt
-
- The debugging output for the compile time looks like this:
-
- compiling RE `[bc]d(ef*g)+h[ij]k$'
- size 43 first at 1
- 1: ANYOF(11)
- 11: EXACT <d>(13)
- 13: CURLYX {1,32767}(27)
- 15: OPEN1(17)
- 17: EXACT <e>(19)
- 19: STAR(22)
- 20: EXACT <f>(0)
- 22: EXACT <g>(24)
- 24: CLOSE1(26)
- 26: WHILEM(0)
- 27: NOTHING(28)
- 28: EXACT <h>(30)
- 30: ANYOF(40)
- 40: EXACT <k>(42)
- 42: EOL(43)
- 43: END(0)
- anchored `de' at 1 floating `gh' at 3..2147483647 (checking floating)
- stclass `ANYOF' minlen 7
-
- The first line shows the pre-compiled form of the regexp,
- and the second shows the size of the compiled form (in
- arbitrary units, usually 4-byte words) and the label _i_d of
- the first node which does a match.
-
- The last line (split into two lines in the above) contains
- the optimizer info. In the example shown, the optimizer
- found that the match should contain a substring de at the
- offset 1, and substring gh at some offset between 3 and
- infinity. Moreover, when checking for these substrings (to
- abandon impossible matches quickly) it will check for the
- substring gh before checking for the substring de. The
- optimizer may also use the knowledge that the match starts
- (at the first _i_d) with a character class, and the match
- cannot be shorter than 7 chars.
-
- The fields of interest which may appear in the last line are
-
- anchored _S_T_R_I_N_G at _P_O_S
-
- floating _S_T_R_I_N_G at _P_O_S_1.._P_O_S_2
- see above;
-
- matching floating/anchored
- which substring to check first;
-
-
-
-
-
- Page 27 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- minlen
- the minimal length of the match;
-
- stclass _T_Y_P_E
- The type of the first matching node.
-
- noscan
- which advises to not scan for the found substrings;
-
- isall
- which says that the optimizer info is in fact all that
- the regular expression contains (thus one does not need
- to enter the RE engine at all);
-
- GPOS if the pattern contains \G;
-
- plus if the pattern starts with a repeated char (as in x+y);
-
- implicit
- if the pattern starts with .*;
-
- with eval
- if the pattern contain eval-groups (see the section on
- (?{ _c_o_d_e }) in the _p_e_r_l_r_e manpage);
-
- anchored(TYPE)
- if the pattern may match only at a handful of places
- (with TYPE being BOL, MBOL, or GPOS, see the table
- below).
-
- If a substring is known to match at end-of-line only, it may
- be followed by $, as in floating `k'$.
-
- The optimizer-specific info is used to avoid entering (a
- slow) RE engine on strings which will definitely not match.
- If isall flag is set, a call to the RE engine may be avoided
- even when optimizer found an appropriate place for the
- match.
-
- The rest of the output contains the list of _n_o_d_e_s of the
- compiled form of the RE. Each line has format
-
- _i_d: _T_Y_P_E _O_P_T_I_O_N_A_L-_I_N_F_O (_n_e_x_t-_i_d)
-
- TTTTyyyyppppeeeessss ooooffff nnnnooooddddeeeessss
-
- Here is the list of possible types with short descriptions:
-
- # TYPE arg-description [num-args] [longjump-len] DESCRIPTION
-
-
-
-
-
-
- Page 28 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- # Exit points
- END no End of program.
- SUCCEED no Return from a subroutine, basically.
-
- # Anchors:
- BOL no Match "" at beginning of line.
- MBOL no Same, assuming multiline.
- SBOL no Same, assuming singleline.
- EOS no Match "" at end of string.
- EOL no Match "" at end of line.
- MEOL no Same, assuming multiline.
- SEOL no Same, assuming singleline.
- BOUND no Match "" at any word boundary
- BOUNDL no Match "" at any word boundary
- NBOUND no Match "" at any word non-boundary
- NBOUNDL no Match "" at any word non-boundary
- GPOS no Matches where last m//g left off.
-
- # [Special] alternatives
- ANY no Match any one character (except newline).
- SANY no Match any one character.
- ANYOF sv Match character in (or not in) this class.
- ALNUM no Match any alphanumeric character
- ALNUML no Match any alphanumeric char in locale
- NALNUM no Match any non-alphanumeric character
- NALNUML no Match any non-alphanumeric char in locale
- SPACE no Match any whitespace character
- SPACEL no Match any whitespace char in locale
- NSPACE no Match any non-whitespace character
- NSPACEL no Match any non-whitespace char in locale
- DIGIT no Match any numeric character
- NDIGIT no Match any non-numeric character
-
- # BRANCH The set of branches constituting a single choice are hooked
- # together with their "next" pointers, since precedence prevents
- # anything being concatenated to any individual branch. The
- # "next" pointer of the last BRANCH in a choice points to the
- # thing following the whole choice. This is also where the
- # final "next" pointer of each individual branch points; each
- # branch starts with the operand node of a BRANCH node.
- #
- BRANCH node Match this alternative, or the next...
-
- # BACK Normal "next" pointers all implicitly point forward; BACK
- # exists to make loop structures possible.
- # not used
- BACK no Match "", "next" ptr points backward.
-
- # Literals
- EXACT sv Match this string (preceded by length).
- EXACTF sv Match this string, folded (prec. by length).
- EXACTFL sv Match this string, folded in locale (w/len).
-
-
-
- Page 29 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- # Do nothing
- NOTHING no Match empty string.
- # A variant of above which delimits a group, thus stops optimizations
- TAIL no Match empty string. Can jump here from outside.
-
- # STAR,PLUS '?', and complex '*' and '+', are implemented as circular
- # BRANCH structures using BACK. Simple cases (one character
- # per match) are implemented with STAR and PLUS for speed
- # and to minimize recursive plunges.
- #
- STAR node Match this (simple) thing 0 or more times.
- PLUS node Match this (simple) thing 1 or more times.
-
- CURLY sv 2 Match this simple thing {n,m} times.
- CURLYN no 2 Match next-after-this simple thing
- # {n,m} times, set parenths.
- CURLYM no 2 Match this medium-complex thing {n,m} times.
- CURLYX sv 2 Match this complex thing {n,m} times.
-
- # This terminator creates a loop structure for CURLYX
- WHILEM no Do curly processing and see if rest matches.
-
- # OPEN,CLOSE,GROUPP ...are numbered at compile time.
- OPEN num 1 Mark this point in input as start of #n.
- CLOSE num 1 Analogous to OPEN.
-
- REF num 1 Match some already matched string
- REFF num 1 Match already matched string, folded
- REFFL num 1 Match already matched string, folded in loc.
-
- # grouping assertions
- IFMATCH off 1 2 Succeeds if the following matches.
- UNLESSM off 1 2 Fails if the following matches.
- SUSPEND off 1 1 "Independent" sub-RE.
- IFTHEN off 1 1 Switch, should be preceeded by switcher .
- GROUPP num 1 Whether the group matched.
-
- # Support for long RE
- LONGJMP off 1 1 Jump far away.
- BRANCHJ off 1 1 BRANCH with long offset.
-
- # The heavy worker
- EVAL evl 1 Execute some Perl code.
-
- # Modifiers
- MINMOD no Next operator is not greedy.
- LOGICAL no Next opcode should set the flag only.
-
- # This is not used yet
- RENUM off 1 1 Group with independently numbered parens.
-
-
-
-
-
- Page 30 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
- # This is not really a node, but an optimized away piece of a "long" node.
- # To simplify debugging output, we mark it as if it were a node
- OPTIMIZED off Placeholder for dump.
-
-
- RRRRuuuunnnn----ttttiiiimmmmeeee oooouuuuttttppppuuuutttt
-
- First of all, when doing a match, one may get no run-time
- output even if debugging is enabled. this means that the RE
- engine was never entered, all of the job was done by the
- optimizer.
-
- If RE engine was entered, the output may look like this:
-
- Matching `[bc]d(ef*g)+h[ij]k$' against `abcdefg__gh__'
- Setting an EVAL scope, savestack=3
- 2 <ab> <cdefg__gh_> | 1: ANYOF
- 3 <abc> <defg__gh_> | 11: EXACT <d>
- 4 <abcd> <efg__gh_> | 13: CURLYX {1,32767}
- 4 <abcd> <efg__gh_> | 26: WHILEM
- 0 out of 1..32767 cc=effff31c
- 4 <abcd> <efg__gh_> | 15: OPEN1
- 4 <abcd> <efg__gh_> | 17: EXACT <e>
- 5 <abcde> <fg__gh_> | 19: STAR
- EXACT <f> can match 1 times out of 32767...
- Setting an EVAL scope, savestack=3
- 6 <bcdef> <g__gh__> | 22: EXACT <g>
- 7 <bcdefg> <__gh__> | 24: CLOSE1
- 7 <bcdefg> <__gh__> | 26: WHILEM
- 1 out of 1..32767 cc=effff31c
- Setting an EVAL scope, savestack=12
- 7 <bcdefg> <__gh__> | 15: OPEN1
- 7 <bcdefg> <__gh__> | 17: EXACT <e>
- restoring \1 to 4(4)..7
- failed, try continuation...
- 7 <bcdefg> <__gh__> | 27: NOTHING
- 7 <bcdefg> <__gh__> | 28: EXACT <h>
- failed...
- failed...
-
- The most significant information in the output is about the
- particular _n_o_d_e of the compiled RE which is currently being
- tested against the target string. The format of these lines
- is
-
- _S_T_R_I_N_G-_O_F_F_S_E_T <_P_R_E-_S_T_R_I_N_G> <_P_O_S_T-_S_T_R_I_N_G> |_I_D: _T_Y_P_E
-
- The _T_Y_P_E info is indented with respect to the backtracking
- level. Other incidental information appears interspersed
- within.
-
-
-
-
-
- Page 31 (printed 10/23/98)
-
-
-
-
-
-
- PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111)))) 22223333////JJJJuuuullll////99998888 ((((ppppeeeerrrrllll 5555....000000005555,,,, ppppaaaattttcccchhhh 00002222)))) PPPPEEEERRRRLLLLDDDDEEEEBBBBUUUUGGGG((((1111))))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 32 (printed 10/23/98)
-
-
-
-
-
-
-